package gcp.cadastros;

import gcp.Colecionavel;
import gcp.Usuario;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Cadastros<br>
 * Classe que representa cadastros de itens Colecionaveis. Um mapa cuja chave eh
 * um Usuario da colecao guarda em seu valor uma lista dos itens colecionados.
 */
public class Cadastros implements Serializable {

    private static final long serialVersionUID = 1L;

    public Map<Usuario, List<Colecionavel>> colecoesDosUsuarios;

    /**
     * Construtor default
     */
    public Cadastros() {
        colecoesDosUsuarios = new HashMap<Usuario, List<Colecionavel>>();
    }

    /**
     * Adiciona na lista de colecionaveis do Usuario um Colecionavel
     * @param usuario Usuario do CGP
     * @param colecionavel Um colecionavel a ser adicionado na lista de
     *            colecionaveis do Usuario
     * @throws Exception Excecao em caso de falhas.
     */
    public void adiciona(Usuario usuario, Colecionavel colecionavel)
            throws Exception {
    	if(usuario==null){
    		throw new Exception();
    	}
    	if(colecionavel==null){
    		throw new Exception();
    	}
        List<Colecionavel> listaDeItens = getList(usuario);
        if (listaDeItens == null) {
            listaDeItens = new ArrayList<Colecionavel>();
            colecoesDosUsuarios.put(usuario, listaDeItens);
        }
        for (Colecionavel item : listaDeItens) {
            if (item.getTitulo().equals(colecionavel.getTitulo())
                    && item.getClass().equals(colecionavel.getClass())) {
                throw new Exception("Nao foi possivel adicionar, o "
                        + "item jah existe no cadastro.");
            }
        }
        listaDeItens.add(colecionavel);
    }

    /**
     * Remove um Colecionavel da lista de Colecionaveis de um Usuario
     * @param usuario Usuario do GCP
     * @param colecionavel O Colecionavel a ser removido da lista de
     *            colecionaveis do Usuario
     * @throws Exception 
     */
    public void removeColecionavel(Usuario usuario, Colecionavel colecionavel) throws Exception {
    	
    	List<Colecionavel> colecaoDoUsuario = getList(usuario);
        colecaoDoUsuario.remove(colecionavel);
    }

    /**
     * A partir do titulo fornecido, encontra na lista do Usuario o Colecionavel
     * correspondente
     * @param usuario Usuario do GCP
     * @param titulo Titulo do colecionavel
     * @return colecionavel O Colecionavel desejado
     */
    public Colecionavel get(Usuario usuario, String titulo) {
        List<Colecionavel> colecaoDoUsuario = getList(usuario);
        for (Colecionavel colecionavel : colecaoDoUsuario) {
            if (colecionavel.getTitulo().equals(titulo))
                return colecionavel;
        }
        return null;

    }

    /**
     * Retorna os Colecionaveis que o Usuario possui
     * @param usuario Usuario do GCP
     * @return lista de jogos que possui o Usuario
     */
    public List<Colecionavel> getList(Usuario usuario) {
        return colecoesDosUsuarios.get(usuario);
    }

    /**
     * Remove o usuario e todos os seus Colecionaveis que este possui
     * @param usuario Usuario a ser removido.
     */
    public void removerUsuario(Usuario usuario) {
        colecoesDosUsuarios.remove(usuario);
    }

    /**
     * Retorna um mapa que possui Usuarios e suas respectivas listas de
     * colecionvaeis
     * @return the colecoesDosUsuarios
     */
    public Map<Usuario, List<Colecionavel>> getColecoesDosUsuarios() {
        return colecoesDosUsuarios;
    }

    /**
     * Altera/define o mapa que possui os Usuarios e seus respectivas listas de
     * colecionaveis
     * @param colecoesDosUsuarios the colecoesDosUsuarios to set
     */
    public void setColecoesDosUsuarios(
            Map<Usuario, List<Colecionavel>> colecoesDosUsuarios) {
        this.colecoesDosUsuarios = colecoesDosUsuarios;
    }

}